package com.wjw.rabbitmq.springbootorderrabbitproducer.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Fanout模式：发布与订阅模式
 * RabbitMQ配置文件类,创建交换机、创建队列、绑定交换机和队列的关系。
 * 可以在生产者和消费者两边同时配置。
 */
@Configuration
public class FanoutRabbitMQConfiguration {

    //1.声明fanout模式的交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        /**
         * 参数1：交换机名称：来源于OrderService中的名称,要保持一致
         * 参数2：是否持久化
         * 参数3：是否自动删除
         */
        return new FanoutExchange("fanout_order_exchange",true,false);
    }

    //2.声明队列：sms.fanout.queue、email.fanout.queue、duanxin.fanout.queue
    @Bean
    public Queue smsQueueFanout(){
        /**
         * 参数1：队列名称
         * 参数2：是否持久化
         */
        return new Queue("sms.fanout.queue",true);
    }

    @Bean
    public Queue emailQueueFanout(){
        /**
         * 参数1：队列名称
         * 参数2：是否持久化
         */
        return new Queue("email.fanout.queue",true);
    }

    @Bean
    public Queue duanxinQueueFanout(){
        /**
         * 参数1：队列名称
         * 参数2：是否持久化
         */
        return new Queue("duanxin.fanout.queue",true);
    }

    //3.完成队列和交换机之间的绑定关系
    @Bean
    public Binding smsBindingFanout(){
        return BindingBuilder.bind(smsQueueFanout()).to(fanoutExchange());
    }

    @Bean
    public Binding emailBindingFanout(){
        return BindingBuilder.bind(emailQueueFanout()).to(fanoutExchange());
    }

    @Bean
    public Binding duanxinBindingFanout(){
        return BindingBuilder.bind(duanxinQueueFanout()).to(fanoutExchange());
    }
}

